package pe.com.bbva.modpre.negocio;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.drools.RuleBase;

import com.vaadin.ui.Window;

import pe.com.bbva.modpre.dominio.AreaCentral;
import pe.com.bbva.modpre.dominio.Cliente;
import pe.com.bbva.modpre.dominio.Deuda;
import pe.com.bbva.modpre.dominio.EmpresaTop;
import pe.com.bbva.modpre.dominio.Equipo;
import pe.com.bbva.modpre.dominio.ExcepcionDuracionCf;
import pe.com.bbva.modpre.dominio.Finanza;
import pe.com.bbva.modpre.dominio.General;
import pe.com.bbva.modpre.dominio.GrupoProducto;
import pe.com.bbva.modpre.dominio.HistorialOperacion;
import pe.com.bbva.modpre.dominio.Integrante;
import pe.com.bbva.modpre.dominio.MedioPago;
import pe.com.bbva.modpre.dominio.Operacion;
import pe.com.bbva.modpre.dominio.OtroBanco;
import pe.com.bbva.modpre.dominio.PagoHaberes;
import pe.com.bbva.modpre.dominio.ProdServPeriodo;
import pe.com.bbva.modpre.dominio.Rating;
import pe.com.bbva.modpre.dominio.Rentabilidad;
import pe.com.bbva.modpre.dominio.Riesgo;
import pe.com.bbva.modpre.dominio.RiesgoMotor;
import pe.com.bbva.modpre.dominio.Segmento;
import pe.com.bbva.modpre.dominio.HistorialDocumento;
import pe.com.bbva.modpre.dominio.HistorialSolicitud;
import pe.com.bbva.modpre.dominio.Sistema;
import pe.com.bbva.modpre.dominio.Situacion;
import pe.com.bbva.modpre.dominio.Solicitud;
import pe.com.bbva.modpre.dominio.Spread;
import pe.com.bbva.modpre.dominio.SpreadFinanciero;
import pe.com.bbva.modpre.dominio.TipoBanca;
import pe.com.bbva.modpre.dominio.TipoBancaTipoDoi;
import pe.com.bbva.modpre.dominio.TipoBancaTipoPlazo;
import pe.com.bbva.modpre.dominio.Usuario;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.dominio.VigenciaTasa;
import pe.com.bbva.modpre.dominio.drools.Motor;

public interface SolicitudService extends ConfiguracionService,Serializable{
	
	List<Cliente> busquedaCliente(Cliente cliente);
	Map<String, List<Operacion>> obtenerMapaSolicitudes(Map<String, Object> mapFiltro);
	Map<String, List<Operacion>> obtenerMapaSolicitudesBandeja(Map<String, Object> mapFiltro);
	List<Usuario> listaUsuarios();
	List<Solicitud> busquedaxResponsable(Usuario usuario);
	void cambiarResponsableSol(List<Operacion> listaOperacion,List<Solicitud> listaSolicitud);
	Solicitud obtenerSolicitud(Long id);
	List<Operacion> obtenerOperacionesxNumeroSolicitud(Solicitud solicitud);
	List<HistorialDocumento> obtenerHistorialDocumentoxSolicitud(Solicitud solicitud);
	void registrarModificarSol(Solicitud solicitud,List<Operacion> listaOperacion);
	List<TipoBanca> buscarTipoBancaxUsuario();
	List<GrupoProducto>buscarGrupoProducto();
	List<Segmento> buscarSegmentoxTipoBanca(String codigo);
	Cliente obtenerClientexDOI(Cliente cliente, TipoBanca tipoBanca, Window window);
	Cliente obtenerClientexCodigoCentral(Cliente cliente, TipoBanca tipoBanca, Window window);
	List<Operacion> operacionxResponsable(Usuario usuario);
	List<Operacion> buscarOperacionesSolicitudResponsable(Solicitud solicitud, Usuario responsable);
	List<TipoBanca> buscarTipoBanca();
	List<Operacion> buscarOperacionesSolicitudEquipo(Solicitud solicitud, Equipo equipo);
	List<Operacion> buscarOperacionesFiltrosReporte(Map<String, Object> mapFiltroReporte,Map<String, Object> mapFiltroTabla,TipoBanca tipoBanca);
	void actualizarLeido(Solicitud solicitud, boolean leido);
	void guardarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos);
	void enviarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos,String comentario);
	void cancelarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,String comentario,Valor motivo);
	void reconsiderarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos,String comentario);
	void subsanarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos,String comentario);
	void dictaminarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos,String comentario);
	void observarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos,String comentario);
	void observarSolicitudAval(Solicitud solicitud,String comentario);
	void cerrarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,List<Situacion> situaciones,
	List<List<HistorialDocumento>> listaHistorialDocumentos,String comentario);
	void elevarSolicitud(Solicitud solicitud,List<Operacion> listaOperacion,
	List<List<HistorialDocumento>> listaHistorialDocumentos,
	String comentario,List<Long> operacionesElevar);
	void adjuntarDocumentos(List<HistorialDocumento> historialDocumentos);
	HistorialSolicitud historialSolicitudUltimo(Solicitud solicitud);
	Situacion obtenerSituacionxCodigo(String codigo);
	List<HistorialSolicitud> historialSolicitudxID(Solicitud solicitud);
	List<HistorialOperacion> historialOperacionxHistorialSolicitud(Long idHistorialS);
	List<HistorialDocumento> obtenerDocumento(HistorialOperacion historialOperacion);
	VigenciaTasa obtenerVigenciaxProducto(Operacion operacion);
	List<Integrante> listaIntegrantes();
	List<Valor> obtenerPlazoxBanca(TipoBanca tipoBanca);
	List<Valor> buscarDOIValorxBanca(TipoBanca tipoBanca);
	List<TipoBancaTipoDoi> obtenerDOIxBanca(TipoBanca tipoBanca);
	ByteArrayOutputStream generarReporte(int tipo,String [] cabecera,String titulo,List<String[]> filasTablas);
	ByteArrayOutputStream generarReportePrevisualizar(int tipo,Solicitud solicitud,List<Operacion> listaOperacion);
//	List<GrupoProducto> 
	void expirarSolicitudes();
	void guardarTipoDoiTipoBanca(TipoBancaTipoDoi doixBanca);
	void guardarTipoPlazaTipoBanca(TipoBancaTipoPlazo plazaxBanca);
	void eliminarTipoPlazaTipoBanca(TipoBancaTipoPlazo plazaxBanca);
	void eliminarTipoDoiTipoBanca(TipoBancaTipoDoi doixBanca);
	List<Valor> obtenerValoresOficina(String descripcion);
	List<Situacion> buscarSituacion();
	void guardarDatosFinancieros(List<PagoHaberes> listaPagoHaberes, List<Spread> listaSpread, List<ProdServPeriodo> listaProdServPeriodo,List<Rating> listaRating,List<General> listaGeneral, List<Deuda> listaDeuda,List<Riesgo> listaRiesgo, List<Rentabilidad> listaRentabilidad, List<OtroBanco> listaOtrosBancos);
	List<SpreadFinanciero> obtenerSpreadFinanciero(String spread1,SpreadFinanciero spread);
	List<ProdServPeriodo> obtenerProdServPeriodoxSolicitud(long id);
	List<Rating> obtenerRatingxSolicitud(long id);
	List<Deuda> obtenerDeudaxSolicitud(long id);
	List<General> obtenerGeneralxSolicitud(long id);
	List<Riesgo> obtenerRiesgoxSolicitud(long id);
	List<Rentabilidad> obtenerRentabilidadxSolicitud(long id);
	List<PagoHaberes> obtenerPagoHaberesxSolicitud(long id);
	List<Spread> obtenerSpreadxSolicitud(long id);
	List<OtroBanco> obtenerOtroBancoxSolicitud(long id);
	List<Integrante> integrantesxEquipo(String codigo);
	List<Operacion> ListaOperConcretadas(Date primerDiaDelMes,Date ultimoDiaDelMes, String string);
	void guardarOperaciones(List<Operacion> operaciones);
	void validarConcretadoDirecto(List<Operacion> listaOperacion);
	List<ExcepcionDuracionCf> buscarExcepcionDuracionCfs(Map<String, Object> map);
	void guardarExcepcionDuracionCf(ExcepcionDuracionCf excepcionDuracionCf);
	void eliminarExcepcionDuracionCf(Long id);
	EmpresaTop obtenerEmpresaxNombre(String nombre);
	
}
